@JsonManagedReference এবং @JsonBackReference হল Jackson-এর দুইটি অ্যানোটেশন, যা Circular References (যখন একটি অবজেক্ট অন্য অবজেক্টকে রেফার করে এবং তার মধ্যে পুনরায় রেফারেন্স তৈরি হয়) নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি বিশেষত Parent-Child রিলেশনশিপের ক্ষেত্রে উপকারী, যেখানে দুটি অবজেক্ট একে অপরকে রেফার করে।
@JsonManagedReference এবং @JsonBackReference এর কাজ
- Circular Reference Handling:
- Jackson-এ Circular References থাকলে, এটি JSON Serialization করার সময় অসীম লুপ তৈরি করতে পারে, যার ফলে
StackOverflowErrorহতে পারে। @JsonManagedReferenceএবং@JsonBackReferenceএই Circular Reference সমস্যা সমাধান করে, যেখানে একটি ফিল্ডকে "managed" (ব্যবস্থাপিত) হিসেবে চিহ্নিত করা হয় এবং অন্যটি "back" (পিছন থেকে) চিহ্নিত হয়।
- Jackson-এ Circular References থাকলে, এটি JSON Serialization করার সময় অসীম লুপ তৈরি করতে পারে, যার ফলে
- One-way Serialization:
@JsonManagedReferenceঅ্যানোটেশনটি Parent অবজেক্টে ব্যবহার করা হয়, এবং@JsonBackReferenceঅ্যানোটেশনটি Child অবজেক্টে ব্যবহার করা হয়। এইভাবে, Child অবজেক্টের রেফারেন্স Parent অবজেক্টে সিঙ্গল দিকের (one-way) Serialization-এ পরিণত হয়।
@JsonManagedReference এবং @JsonBackReference এর উদাহরণ
উদাহরণ: Parent-Child Relationship
ধরা যাক, আমাদের একটি Person ক্লাস এবং একটি Address ক্লাস আছে। Person অবজেক্টে একটি Address অবজেক্ট রয়েছে এবং Address অবজেক্ট আবার Person কে রেফার করে (bi-directional relationship)। এটি Circular Reference তৈরি করবে।
কোড উদাহরণ:
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
public class Person {
private String name;
@JsonManagedReference // Parent side of the relationship
private Address address;
// Constructors, Getters and Setters
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
}
public class Address {
private String street;
@JsonBackReference // Child side of the relationship
private Person person;
// Constructors, Getters and Setters
public Address(String street, Person person) {
this.street = street;
this.person = person;
}
public String getStreet() {
return street;
}
public Person getPerson() {
return person;
}
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonManagedBackReferenceExample {
public static void main(String[] args) throws Exception {
Address address = new Address("1234 Elm St", null);
Person person = new Person("John", address);
address = new Address("1234 Elm St", person);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(person);
System.out.println(json);
}
}
JSON Output:
{
"name": "John",
"address": {
"street": "1234 Elm St"
}
}
ব্যাখ্যা:
@JsonManagedReferenceঅ্যানোটেশনটি Person অবজেক্টে ব্যবহার করা হয়েছে, যার মাধ্যমেAddressঅবজেক্টেরstreetফিল্ড JSON আউটপুটে দৃশ্যমান হয়েছে।@JsonBackReferenceঅ্যানোটেশনটি Address অবজেক্টে ব্যবহার করা হয়েছে, যার মাধ্যমেPersonরেফারেন্স JSON আউটপুটে প্রদর্শিত হয়নি।- Circular Reference সমস্যা এড়ানো হয়েছে, কারণ
Personঅবজেক্টের মধ্যে থাকাAddressঅবজেক্টটি ফ্ল্যাট হয়ে গেছে এবং এটি সঠিকভাবে সিরিয়ালাইজ হয়েছে।
@JsonManagedReference এবং @JsonBackReference এর সুবিধা
- Circular Reference থেকে মুক্তি:
- এ দুটি অ্যানোটেশন Circular References এড়াতে সাহায্য করে, যা JSON Serialization-এর সময় StackOverflow Error থেকে রক্ষা করে।
- Serialization Control:
- আপনি Control করতে পারেন কোন অবজেক্ট ফিল্ডটি JSON আউটপুটে থাকবে এবং কোনটি থাকবে না।
- Parent-Child Relationship:
- Parent-Child রিলেশনশিপের ক্ষেত্রে একে অপরকে রেফার করলেও, একপক্ষের অবজেক্টের ফিল্ড JSON আউটপুটে প্রদর্শিত হয়, অন্যটি শুধুমাত্র
@JsonBackReferenceএর মাধ্যমে ইনভিজিবল হয়ে যায়।
- Parent-Child রিলেশনশিপের ক্ষেত্রে একে অপরকে রেফার করলেও, একপক্ষের অবজেক্টের ফিল্ড JSON আউটপুটে প্রদর্শিত হয়, অন্যটি শুধুমাত্র
- Efficient Data Representation:
- Nested অথবা Circular Data Representations এড়ানো হয়, যা JSON ফাইলের আকার ছোট করে এবং ডেটা ব্যবস্থাপনাকে সহজ করে তোলে।
@JsonManagedReference এবং @JsonBackReference এর সীমাবদ্ধতা
- Bidirectional Relationships:
- যদি সম্পর্ক দুটি দিকে থাকে (bidirectional), তবে এগুলো কেবল একটি দিককে
@JsonManagedReferenceএবং অন্যটি@JsonBackReferenceহিসেবে চিহ্নিত করতে ব্যবহৃত হয়।
- যদি সম্পর্ক দুটি দিকে থাকে (bidirectional), তবে এগুলো কেবল একটি দিককে
- Complex Circular References:
- Jackson-এ আরও জটিল Circular References থাকলে, এই অ্যানোটেশনগুলি পুরোপুরি কার্যকর নাও হতে পারে। এর জন্য
@JsonIdentityInfoব্যবহার করা যেতে পারে।
- Jackson-এ আরও জটিল Circular References থাকলে, এই অ্যানোটেশনগুলি পুরোপুরি কার্যকর নাও হতে পারে। এর জন্য
- Single-direction Serialization:
- যদি আপনার প্রয়োজন হয় bidirectional Serialization এর, তবে
@JsonManagedReferenceএবং@JsonBackReferenceপুরোপুরি কাজ করবে না। অন্যভাবে, আপনাকে@JsonIdentityInfoব্যবহার করতে হতে পারে।
- যদি আপনার প্রয়োজন হয় bidirectional Serialization এর, তবে
@JsonManagedReference এবং @JsonBackReference এর বিকল্প
@JsonIdentityInfo:- Circular Reference সমস্যা সমাধানে আরও কার্যকর একটি বিকল্প। এটি object identity এর মাধ্যমে Circular Reference পরিচালনা করতে সাহায্য করে।
@JsonIdentityInfo উদাহরণ:
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Person {
private int id;
private String name;
// Constructors, Getters and Setters
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Address {
private int id;
private String street;
// Constructors, Getters and Setters
}
@JsonManagedReferenceএবং@JsonBackReferenceJackson এর অত্যন্ত কার্যকর অ্যানোটেশন, যা Circular Reference সমস্যার সমাধান করে এবং Parent-Child সম্পর্কের জন্য একটি একপক্ষীয় Serialization নিশ্চিত করে।@JsonManagedReferenceParent অবজেক্টে এবং@JsonBackReferenceChild অবজেক্টে ব্যবহার করতে হয়।- এই অ্যানোটেশনগুলি ব্যবহার করে, আমরা Circular References এবং Bidirectional Relationships JSON ডেটাতে সহজে এবং সঠিকভাবে ম্যানেজ করতে পারি।
Content added By
Read more